home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.3 (Developer)…68k, x86, SPARC, PA-RISC] / NeXTSTEP 3.3 Dev Intel.iso / NextDeveloper / Source / GNU / build_gcc next >
Text File  |  1994-05-04  |  16KB  |  607 lines

  1. #!/bin/sh
  2. ############################################################
  3. ##
  4. ##  implementation of the "build" target of cc makefile
  5. ##
  6. ############################################################
  7.  
  8. PATH=/bin:/usr/bin
  9. export PATH
  10.  
  11. # what targets to produce compilers to
  12. TARGETS=`arch`
  13.  
  14. # what host we should produce executables for
  15. HOSTS=`arch`
  16.  
  17. # the host on which we are running at now
  18. BUILD=`arch`
  19.  
  20. # where to do the build .. better have lots of space there!
  21. SRCROOT=~comp/cc_proj/cc
  22.  
  23. # where to do the build .. better have lots of space there!
  24. OBJROOT=
  25.  
  26. # where to do the build .. better have lots of space there!
  27. SYMROOT=
  28.  
  29. # where to do the build .. better have lots of space there!
  30. DSTROOT=
  31.  
  32. # where to do the build .. better have lots of space there!
  33. BUILDROOT=/private/tmp
  34.  
  35. # what compilers to build.  On NeXT, we only use those two.
  36. LANGUAGES="objc objc++"
  37.  
  38. # Optimize flags when compiling the compiler
  39. CFLAGS=-g
  40. OPTIMIZE=-O
  41.  
  42. result=fats
  43.  
  44. for arg
  45. do
  46.   case $next_arg in
  47.   --srcroot)
  48.     SRCROOT=$arg
  49.     next_arg=
  50.     ;;
  51.   --objroot)
  52.     OBJROOT=$arg
  53.     next_arg=
  54.     ;;
  55.   --dstroot)
  56.     DSTROOT=$arg
  57.     next_arg=
  58.     ;;
  59.   --symroot)
  60.     SYMROOT=$arg
  61.     next_arg=
  62.     ;;
  63.   --buildroot)
  64.     BUILDROOT=$arg
  65.     next_arg=
  66.     ;;
  67.   --host*)
  68.     HOSTS=$arg
  69.     next_arg=
  70.     ;;
  71.   --target*)
  72.     TARGETS=$arg
  73.     next_arg=
  74.     ;;
  75.   --cflags)
  76.     CFLAGS=$arg
  77.     next_arg= 
  78.     ;;
  79.   *)
  80.     case $arg in
  81.     --srcroot=*)
  82.         SRCROOT=`echo $arg | sed 's/-*s[a-z]*=//'`
  83.         ;;
  84.  
  85.     --objroot=*)
  86.         OBJROOT=`echo $arg | sed 's/-*o[a-z]*=//'`
  87.         ;;
  88.  
  89.     --dstroot=*)
  90.         DSTROOT=`echo $arg | sed 's/-*d[a-z]*=//'`
  91.         ;;
  92.  
  93.     --symroot=*)
  94.         SYMROOT=`echo $arg | sed 's/-*s[a-z]*=//'`
  95.         ;;
  96.  
  97.     --buildroot=*)
  98.         BUILDROOT=`echo $arg | sed 's/-*b[a-z]*=//'`
  99.         ;;
  100.  
  101.     --hosts=*|--host=*)
  102.         HOSTS=`echo $arg | sed 's/-*h[a-z]*=//'`
  103.         ;;
  104.  
  105.     --targets=*|--target=*)
  106.         TARGETS=`echo $arg | sed 's/-*t[a-z]*=//'`
  107.         ;;
  108.  
  109.     --cflags=*)
  110.         CFLAGS=`echo $arg | sed 's/-*c[a-z]*=//'`
  111.         ;;
  112.  
  113.     --optimize=*)
  114.         if [ `echo $arg | sed 's/-*o[a-z]*=//'` = yes ]; then
  115.           OPTIMIZE=-O
  116.         else
  117.           OPTIMIZE=
  118.         fi
  119.         ;;
  120.  
  121.     --fat|--fats)
  122.         result=fats
  123.         ;;
  124.  
  125.     --thin|--thins)
  126.         result=thins
  127.         ;;
  128.  
  129.     --clean)
  130.         result=clean
  131.         ;;
  132.  
  133.     --configure)
  134.         result=configure
  135.         ;;
  136.  
  137.       --optimize)
  138.         OPTIMIZE=-O
  139.         ;;
  140.  
  141.       --no-optimize)
  142.         OPTIMIZE=
  143.         ;;
  144.  
  145.     --*)
  146.         next_arg=$arg
  147.         ;;
  148.     *)
  149.         echo unknown option $arg
  150.         exit 1
  151.         ;;
  152.     esac
  153.   esac
  154. done
  155.  
  156. # get the version
  157. CCVERS=`cd $SRCROOT; vers_string -f cc`
  158.  
  159. # remove any -arch flags from CFLAGS
  160. CFLAGS=`echo $CFLAGS|sed 's/-arch [a-z0-9]*//g'`
  161.  
  162. # add target arch...
  163. if [ x$RC_RELEASE != x ]; then
  164.   CFLAGS="$CFLAGS -DRC_RELEASE_"`echo $RC_RELEASE|tr '.' '_'`
  165. fi
  166.  
  167. if [ x$SYMROOT = x ]; then
  168.   SYMROOT=$BUILDROOT/$CCVERS.sym
  169. fi
  170.  
  171. if [ x$OBJROOT = x ]; then
  172.   OBJROOT=$BUILDROOT/$CCVERS.obj
  173. fi
  174.  
  175. if [ x$DSTROOT = x ]; then
  176.   DSTROOT=$BUILDROOT/$CCVERS.dst
  177. fi
  178.  
  179. # set up bison environment
  180. BISON=$OBJROOT/bison_`arch`_obj/bison
  181. BISON_SIMPLE=$BISON.s1
  182. export BISON_SIMPLE
  183.  
  184. echo ===========================================================
  185. echo == 'Building NeXT C compiler(s) **' $result '**'
  186. echo ===========================================================
  187. echo == 'HOSTS     :' ${HOSTS}
  188. echo == 'TARGETS   :' ${TARGETS}
  189. echo == 'BUILDHOST :' `hostname` -- a `arch`
  190. echo == 'OBJROOT   :' ${OBJROOT}
  191. echo == 'SYMROOT   :' ${SYMROOT}
  192. echo == 'SRCROOT   :' ${SRCROOT}
  193. echo == 'DSTROOT   :' ${DSTROOT}
  194. echo == 'VERSION   :' ${CCVERS}
  195. echo == 'CFLAGS    :' ${OPTIMIZE} ${CFLAGS}
  196. echo ===========================================================
  197.  
  198.  
  199. #
  200. # Check that cross compilers are available
  201. #
  202.  
  203. missing_cross=no
  204.  
  205. for host in ${HOSTS}; do 
  206.   if [ -d /lib/$host ]; then true; else 
  207.     echo "************************************************************"
  208.     echo "** You must have a cross compiler for $host installed"
  209.     missing_cross=yes
  210.   fi; 
  211. done  
  212.  
  213. for host in $HOSTS; do
  214.   if echo $TARGETS | grep $host > /dev/null 2>&1; then true; else
  215.     echo '************************************************************'
  216.     echo '**' "hosttype $host must also be a target"
  217.     missing_cross=yes
  218.   fi    
  219. done
  220.  
  221. if [ $missing_cross = yes ]; then
  222.   echo "************************************************************"
  223.   exit 1;
  224. fi
  225.  
  226.  
  227. safe_exec () {
  228.   if ($*); then true; else exit 1; fi
  229. }
  230.  
  231. clean_gcc () {
  232. echo ===========================================================
  233. echo == 'Cleaning NeXT C compiler(s)'
  234. echo ===========================================================
  235.  
  236. for target in ${TARGETS}; do 
  237.   for host in ${HOSTS}; do 
  238.     echo '==' ${OBJROOT}/cc-$target-on-$host; 
  239.     if [ -d ${OBJROOT}/cc-$target-on-$host ]; then
  240.       /bin/rm -Rf ${OBJROOT}/cc-$target-on-$host; 
  241.     fi
  242.   done
  243. done
  244. for host in ${HOSTS}; do 
  245.   if [ -d ${SYMROOT}/$host ]; then
  246.     echo '==' ${SYMROOT}/$host; 
  247.     /bin/rm -Rf ${SYMROOT}/$host; 
  248.   fi
  249. done
  250. if [ X${DSTROOT} != X${SRCROOT} ]; then
  251.   if [ -d ${DSTROOT} ]; then
  252.     echo '==' ${DSTROOT};
  253.     /bin/rm -Rf ${DSTROOT};
  254.   fi
  255. fi
  256. echo ===========================================================
  257. }
  258.  
  259. configure_gcc () {
  260. for target in ${TARGETS}; do 
  261.   for host in ${HOSTS}; do 
  262.     mkdirs ${OBJROOT}/cc-$target-on-$host; 
  263.     cd ${OBJROOT}/cc-$target-on-$host; 
  264.  
  265.     source=bad
  266.     if [ -f make.id ]; then
  267.       if [ X`cat make.id` = X${SRCROOT}/cc:`arch` ]; then
  268.         source=ok
  269.       fi
  270.     fi
  271.  
  272.     if [ X$source = Xok -a -f Makefile ]; then
  273.       echo ===========================================================; 
  274.       echo == updating Makefile for cc-$target-on-$host\; buildhost=`arch` 
  275.       echo ===========================================================; 
  276.       safe_exec make Makefile
  277.     else 
  278.       echo ===========================================================; 
  279.       echo == configuring cc-$target-on-$host\; buildhost=`arch`
  280.       echo ===========================================================; 
  281.       /bin/rm -f make.id
  282.       echo ${SRCROOT}/cc:`arch` > make.id
  283.       /bin/rm -f rtl.o bc-*.o
  284.       ${SRCROOT}/cc/configure \
  285.       --host=$host-next-mach \
  286.       --target=$target-next-mach \
  287.       --build=`arch`-next-mach \
  288.           --srcdir=${SRCROOT}/cc \
  289.       --force-build; 
  290.     fi; 
  291.   done; 
  292. done
  293. }
  294.  
  295. install_newer () {
  296.   if [ -f "$1" ]; then
  297.     rm -f /tmp/make.$$
  298.     touch -f /tmp/make.$$
  299.     echo "$2: $1"             >> /tmp/make.$$
  300.     echo "    /bin/rm -f $2"        >> /tmp/make.$$
  301.     echo "    install -c $3 $1 $2"    >> /tmp/make.$$
  302.     safe_exec make -f /tmp/make.$$
  303.     rm -f /tmp/make.$$
  304.   else
  305.     echo "build_gcc: $1: no such file"
  306.   fi
  307. }
  308.  
  309.  
  310. build_compiler () { 
  311. for host in ${HOSTS}; do 
  312.   for target in ${TARGETS}; do 
  313.     cd ${OBJROOT}/cc-$target-on-$host; 
  314.     echo ===========================================================; 
  315.     echo == building cc-$target-on-$host\; buildhost:`arch`; 
  316.     echo ===========================================================; 
  317.  
  318.     #############################################################
  319.     # this will build the core compilers
  320.     #############################################################
  321.  
  322.     if [ -d `arch` ]; then true; else mkdir `arch`; fi
  323.     if make all.build \
  324.         srcdir=${SRCROOT}/cc \
  325.     LANGUAGES="${LANGUAGES}" \
  326.     HOST_PREFIX="`arch`-" HOST_PREFIX_1="`arch`-" \
  327.     HOST_CC="cc -arch `arch` -traditional-cpp" \
  328.     BISON=${BISON} \
  329.     CFLAGS="${OPTIMIZE} ${CFLAGS}" \
  330.     CC="cc -arch $host -traditional-cpp"; \
  331.     then echo '== ok' ; else exit 1; fi
  332.  
  333.     sym=$SYMROOT/$host
  334.  
  335.     mkdirs $sym/lib/$target
  336.     mkdirs $sym/bin
  337.  
  338.     install_newer cpp        $sym/lib/$target/cpp      "-m 555"
  339.     install_newer cc1obj     $sym/lib/$target/cc1obj      "-m 555"
  340.     install_newer cc1objplus $sym/lib/$target/cc1objplus "-m 555"
  341.  
  342.   done
  343.  
  344.   if echo $TARGETS | grep $host; then
  345.     install_newer ${OBJROOT}/cc-$host-on-$host/xgcc $sym/bin/cc "-m 555"
  346.   else
  347.     echo '************************************************************'
  348.     echo '**' "hosttype $host must also be a target"
  349.     echo '************************************************************'
  350.     exit 1;
  351.   fi    
  352.  
  353. done
  354. }
  355.  
  356.  
  357. build_libgcc () {
  358. for target in ${TARGETS}; do 
  359.  
  360.   host=`arch`
  361.   mkdirs ${OBJROOT}/cc-$target-on-$host;     
  362.   cd ${OBJROOT}/cc-$target-on-$host;     
  363.  
  364.   # the buildhost is in hosts..
  365.   if echo $HOSTS | grep $host; then
  366.  
  367.     #############################################################
  368.     # now, build the gcc specs and runtime libraries 
  369.     #############################################################
  370.  
  371.     echo "============================================================"
  372.     echo "== Building runtime libraries, using new compiler:"
  373.     ./xgcc -B./ -v
  374.     echo "============================================================"
  375.  
  376.     echo '== building static version'
  377.     if [ -f libgcc_static.a ]; then mv -f libgcc_static.a libgcc.a; fi
  378.     if [ -f libgcc1_static.a ]; then mv -f libgcc1_static.a libgcc1.a; fi
  379.     if [ -f libgcc2_static.a ]; then mv -f libgcc2_static.a libgcc2.a; fi
  380.  
  381.     if make specs libgcc1.a libgcc.a \
  382.         srcdir=${SRCROOT}/cc \
  383.     LANGUAGES="${LANGUAGES}" \
  384.     HOST_PREFIX="`arch`-" HOST_PREFIX_1="`arch`-" \
  385.     HOST_CC="cc -arch `arch` -traditional-cpp" \
  386.     OLDCC="./xgcc -B./" \
  387.     CCLIBFLAGS="${OPTIMIZE} ${CFLAGS}" \
  388.     GCC_FOR_TARGET="./xgcc -B./" \
  389.     CFLAGS="${OPTIMIZE} ${CFLAGS}" \
  390.     BISON=${BISON} \
  391.     GCC_CFLAGS="-traditional-cpp ${CFLAGS}" \
  392.     AR_FOR_TARGET=ar LIBGCC1=libgcc1.a \
  393.     CC="cc -arch $host -traditional-cpp"; \
  394.     then echo '== ok'; else exit 1; fi
  395.  
  396.     mv -f libgcc.a libgcc_static.a
  397.     mv -f libgcc1.a libgcc1_static.a
  398.     mv -f libgcc2.a libgcc2_static.a
  399.     echo '== building shlib version'
  400.     if [ -f libgcc_shlib.a ]; then mv -f libgcc_shlib.a libgcc.a; fi
  401.     if [ -f libgcc1_shlib.a ]; then mv -f libgcc1_shlib.a libgcc1.a; fi
  402.     if [ -f libgcc2_shlib.a ]; then mv -f libgcc2_shlib.a libgcc2.a; fi
  403.  
  404.     if make specs libgcc1.a libgcc.a \
  405.         srcdir=${SRCROOT}/cc \
  406.     LANGUAGES="${LANGUAGES}" \
  407.     HOST_PREFIX="`arch`-" HOST_PREFIX_1="`arch`-" \
  408.     HOST_CC="cc -arch `arch` -traditional-cpp -DSHLIB" \
  409.     OLDCC="./xgcc -B./ -DSHLIB" \
  410.     CCLIBFLAGS="${OPTIMIZE} ${CFLAGS} -DSHLIB" \
  411.     GCC_FOR_TARGET="./xgcc -B./ -DSHLIB" \
  412.     CFLAGS="${OPTIMIZE} ${CFLAGS} -DSHLIB" \
  413.     BISON=${BISON} \
  414.     GCC_CFLAGS="-traditional-cpp ${CFLAGS} -DSHLIB" \
  415.     AR_FOR_TARGET=ar LIBGCC1=libgcc1.a \
  416.     CC="cc -arch $host -traditional-cpp -DSHLIB"; \
  417.     then echo '== ok'; else exit 1; fi
  418.  
  419.     mv -f libgcc.a libgcc_shlib.a
  420.     mv -f libgcc1.a libgcc1_shlib.a
  421.     mv -f libgcc2.a libgcc2_shlib.a
  422.  
  423.     for host in ${HOSTS}; do
  424.       sym=$SYMROOT/$host
  425.  
  426.       mkdirs $sym/lib/$target
  427.       install_newer specs    $sym/lib/$target/specs "-m 444"
  428.       install_newer libgcc_static.a    $sym/lib/$target/libcc.a "-r -m 444"
  429.  
  430.     done
  431.  
  432.     libgcc=`pwd`/libgcc_shlib.a
  433.     shlib=${OBJROOT}/shlib_${target}_obj
  434.     (mkdirs $shlib; cd $shlib; ar x $libgcc)
  435.  
  436.   else
  437.  
  438.     ############################################################
  439.     # copy specs /lib/$target...
  440.     ############################################################
  441.  
  442.     if [ -d /lib/$target ]; then
  443.  
  444.     # get version of installed $target compiler
  445.  
  446.           cc -arch $target -v 2> /tmp/tmp.$$
  447.     target_vers=`cat /tmp/tmp.$$         \
  448.           | grep 'version'    \
  449.           | sed 's/, gcc.*$//'    \
  450.           | sed 's/^.*version //'`
  451.     rm /tmp/tmp.$$
  452.  
  453.     if [ X$target_vers != X$CCVERS ]; then
  454.       echo "************************************************************";
  455.       echo "** You must have the most resent version of the compiler    "
  456.       echo "** (host=" `arch` " target=$target version=$CCVERS) installed"
  457.       echo "** on the build host to finish this build...  "
  458.       echo "** Currently, version $target_vers is installed "
  459.       echo "************************************************************";
  460.             exit 1; 
  461.     fi
  462.  
  463.     echo "============================================================"
  464.     echo "== Building runtime libraries, using installed compiler:"
  465.     cc -arch $target -v
  466.     echo "============================================================"
  467.  
  468.     rm -f specs
  469.     cp /lib/$target/specs specs
  470.  
  471.     echo '== building static version'
  472.         if [ -f libgcc_static.a ]; then mv -f libgcc_static.a libgcc.a; fi
  473.     if [ -f libgcc1_static.a ]; then mv -f libgcc1_static.a libgcc1.a; fi
  474.         if [ -f libgcc2_static.a ]; then mv -f libgcc2_static.a libgcc2.a; fi
  475.  
  476.         if make libgcc1.a libgcc.a \
  477.           srcdir=${SRCROOT}/cc \
  478.       LANGUAGES="${LANGUAGES}" \
  479.       HOST_PREFIX="`arch`-" HOST_PREFIX_1="`arch`-" \
  480.       HOST_CC="cc -arch `arch` -traditional-cpp" \
  481.       OLDCC="cc -arch $target" \
  482.       BISON=${BISON} \
  483.       GCC_FOR_TARGET="cc -arch $target" \
  484.       CFLAGS="${OPTIMIZE} ${CFLAGS}" \
  485.       GCC_CFLAGS="-traditional-cpp" \
  486.       AR_FOR_TARGET=ar LIBGCC1=libgcc1.a \
  487.       CC="cc -arch $host -traditional-cpp"; \
  488.       then echo '== ok'; else exit 1; fi
  489.  
  490.         mv -f libgcc.a libgcc_static.a
  491.         mv -f libgcc1.a libgcc1_static.a
  492.         mv -f libgcc2.a libgcc2_static.a
  493.     echo '== building shlib version'
  494.         if [ -f libgcc_shlib.a ]; then mv -f libgcc_shlib.a libgcc.a; fi
  495.         if [ -f libgcc1_shlib.a ]; then mv -f libgcc1_shlib.a libgcc1.a; fi
  496.         if [ -f libgcc2_shlib.a ]; then mv -f libgcc2_shlib.a libgcc2.a; fi
  497.  
  498.         if make libgcc1.a libgcc.a \
  499.           srcdir=${SRCROOT}/cc \
  500.       LANGUAGES="${LANGUAGES}" \
  501.       HOST_PREFIX="`arch`-" HOST_PREFIX_1="`arch`-" \
  502.       HOST_CC="cc -arch `arch` -traditional-cpp -DSHLIB" \
  503.       OLDCC="cc -arch $target -DSHLIB" \
  504.       BISON=${BISON} \
  505.       GCC_FOR_TARGET="cc -arch $target -DSHLIB" \
  506.       CFLAGS="${OPTIMIZE} ${CFLAGS} -DSHLIB" \
  507.       GCC_CFLAGS="-traditional-cpp -DSHLIB" \
  508.       AR_FOR_TARGET=ar LIBGCC1=libgcc1.a \
  509.       CC="cc -arch $host -traditional-cpp -DSHLIB"; \
  510.       then echo '== ok'; else exit 1; fi
  511.  
  512.         mv -f libgcc.a libgcc_shlib.a
  513.         mv -f libgcc1.a libgcc1_shlib.a
  514.         mv -f libgcc2.a libgcc2_shlib.a
  515.  
  516.         for host in ${HOSTS}; do
  517.           sym=$SYMROOT/$host
  518.           mkdirs $sym/lib/$target
  519.           install_newer /lib/$target/specs $sym/lib/$target/specs "-m 444"
  520.           install_newer /lib/$target/libgcc_static.a $sym/lib/$target/libcc.a "-r -m 444"
  521.         done
  522.  
  523.         libgcc=`pwd`/libgcc_shlib.a
  524.         shlib=${OBJROOT}/shlib_${target}_obj
  525.         (mkdirs $shlib; cd $shlib; ar x $libgcc)
  526.  
  527.  
  528.     else
  529.     echo "************************************************************";
  530.     echo "** You must have the most resent version of the compiler    "
  531.     echo "** (host=" `arch` "; target=$target; version=$CCVERS) installed"
  532.     echo "** on the build host to finish this build...  "
  533.     echo "** Currently, no such compiler is installed "
  534.     echo "************************************************************";
  535.           exit 1; 
  536.     fi; 
  537.   fi
  538. done
  539. }
  540.  
  541. install_fat () {
  542.  
  543. echo "============================================================"
  544. echo "== Building fat binaries [$HOSTS] fat for targets: $TARGETS"
  545. echo "============================================================"
  546.  
  547. fat=$DSTROOT
  548. sym=$SYMROOT
  549. mkdirs $fat 
  550. mkdirs $fat/bin 
  551. mkdirs $fat/lib 
  552.  
  553. for target in ${TARGETS}; do 
  554.   mkdirs $fat/lib/$target; 
  555.   for file in     bin/cc \
  556.              lib/$target/cpp \
  557.               lib/$target/cc1obj \
  558.               lib/$target/cc1objplus; do 
  559.     thin_files="" 
  560.     for host in ${HOSTS}; do 
  561.       thin_files="$thin_files $sym/$host/$file" 
  562.     done 
  563.     rm -f $fat/$file 
  564.  
  565.     rm -f /tmp/make.$$
  566.     touch -f /tmp/make.$$
  567.     echo "$fat/$file: $thin_files"                >> /tmp/make.$$
  568.     echo "    /bin/rm -f $fat/$file"                >> /tmp/make.$$
  569.     echo "    lipo -create -output $fat/$file $thin_files"    >> /tmp/make.$$
  570.     echo "    strip $fat/$file"                >> /tmp/make.$$
  571.     echo "    chmod 555 $fat/$file"                >> /tmp/make.$$
  572.     safe_exec make -f /tmp/make.$$    
  573.     rm -f /tmp/make.$$
  574.   done 
  575.  
  576.   install_newer $sym/$host/lib/$target/specs $fat/lib/$target/specs "-m 444"
  577.   install_newer $sym/$host/lib/$target/libcc.a $fat/lib/$target/libcc.a "-r -m 444"
  578. done; 
  579.  
  580. }
  581.  
  582. if [ X$result = Xclean ]; then
  583.   clean_gcc
  584.   exit 0
  585. fi
  586.  
  587. configure_gcc 
  588.  
  589. if [ X$result = Xconfigure ]; then
  590.   exit 0
  591. fi
  592.  
  593. build_compiler
  594. build_libgcc
  595.  
  596. if [ $result = thins ]; then
  597.   exit 0;
  598. fi
  599.  
  600. install_fat
  601.  
  602.  
  603.  
  604.  
  605.  
  606.  
  607.